项目场景
最近为自己的机械臂基于 hardware_interface 写了一个驱动,并希望接入 ros_control 使用 moveit 进行控制,但是在 controller_manager 加载控制器的时候停在了 loading_controller 上。
问题描述
在 launch 中导入 joint_state_controller 控制器:
1 | <node name="rf_hybrid_arm_controller_spawner" |
在驱动中进行了一个这样的循环:
1 | ros::init(argc, argv, "rf_hybrid_arm_driver_node"); |
这个基本就是参照 ros_control 的官方教程编写的。
问题分析
controller_manager 卡在 loading_controller 通常有以下几个原因:
- 控制器插件未正确注册 - 检查
pluginlib配置文件 - 控制器类未正确继承 - 检查是否继承自
controller_interface::ControllerBase - 依赖未安装 - 检查
CMakeLists.txt和package.xml - 命名空间问题 - 检查 ROS 命名空间配置
解决方案
1. 检查 pluginlib 配置
确保在 package.xml 中添加了正确的依赖:
1 | <build_depend>controller_interface</build_depend> |
2. 检查控制器类定义
确保控制器类正确继承并实现了必要的方法:
1 | class MyController : public controller_interface::Controller<RFHybridArmHW> |
3. 检查 CMakeLists.txt
确保正确链接了相关库:
1 | find_package(controller_interface REQUIRED) |
4. 检查 launch 文件
确保控制器名称和类型正确:
1 | <node name="controller_spawner" |
调试技巧
1. 查看详细日志
1 | roslaunch your_package your_launch_file.launch --screen |
2. 检查控制器列表
1 | rosservice call /controller_manager/list_controllers |
3. 检查插件注册
1 | rospack plugins --attrib=plugin controller_interface |
总结
controller_manager 卡在 loading_controller 通常是由于控制器插件未正确注册或控制器类定义有问题。按照上述步骤逐一排查,一般都能解决问题。
原文链接
本文原载于 CSDN:【ROS】controller_manager 卡在 loading_controller
最后更新:2026 年 3 月